package com.example.annotations.configuration;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnResource;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.annotation.Order;


@ConditionalOnResource(resources = {"classpath:resources/config/spring-test.xml"})
/**
 * 当类路径下有指定资源文件时，才允许其实例化该类，如果有多个@conditionalOnXXX系列的注解，则必须全满足才能实例化。
 * 注意：本身没有实例化的功能
 */
@Import({TestConfiguration.EnableTestConfiguration.class})//指定多个按,分隔。实例化顺序为从左到右，也就是数组的0到尾/*在该配置类实例化之前先加载实例化@import指定的类,不会实例化配置类,但会实例化指定的类*/
@AutoConfigureAfter(TestConfiguration.EnableTestConfiguration.class)
/**
 * 作用：配置类将在该注解指定的类加载实例化之后才加载实例化，但不会实例化配置类,也不会实例化指定的类
 */
//@AutoConfigureBefore同理
@PropertySource(value={"classpath:resources/config/test-configuration.properties"},encoding="UTF-8",ignoreResourceNotFound=false)
/**
 * 作用：加载指定的配置文件，即该类可以通过${key}的方式读取配置文件里的值
 * @PropertySource的属性
 * encoding：指定读取配置文件的编码
 * ignoreResourceNotFound：false如果配置文件不存在，则报错
 */
@EnableConfigurationProperties(TestProperties.class)
/**
 * @EnableConfigurationProperties(TestProperties.class)
 * 作用：对其指定的类进行实例化，在TestConfiguration实例化之前实例化。
 */
@Configuration
@Order(1)
/**
 * 定义实例化加载的顺序，数值越低，越先加载
 */
public class TestConfiguration {
    @Autowired
    TestProperties properties;
    @Autowired
    private EnableTestConfiguration enableTestConfiguration;
    @Value("${num}")//为基本属性注入属性值，可以引用@PropertySource配置文件里的值
    private int num;

    public EnableTestConfiguration getEnableTestConfiguration() {
        return enableTestConfiguration;
    }

    public void setEnableTestConfiguration(EnableTestConfiguration enableTestConfiguration) {
        this.enableTestConfiguration = enableTestConfiguration;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public TestProperties getProperties() {
        return properties;
    }

    public void setProperties(TestProperties properties) {
        this.properties = properties;
    }
    public void fun(){
        System.out.println("执行方法");
    }
    class EnableTestConfiguration{

        int init;
        public void depend(){
            System.out.println("TestConfiguration依赖的类已经实例化，初始化了。");
        }
    }
}
